🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / feature / node / src / commonTest / kotlin / org / meshtastic / feature / node / list / NodeListViewModelTest.kt
Displaying Raw • Download
feature/node/src/commonTest/kotlin/org/meshtastic/feature/node/list/NodeListViewModelTest.kt e330442dd5415dc7eb2bff4e3a3f1599c18022a1 (e330442d) Text, 6.31 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.node.list
Tff7b72import T7ee787androidx.lifecycle.SavedStateHandle
Tff7b72import T7ee787app.cash.turbine.test
Tff7b72import T7ee787dev.mokkery.MockMode
Tff7b72import T7ee787dev.mokkery.answering.returns
Tff7b72import T7ee787dev.mokkery.every
Tff7b72import T7ee787dev.mokkery.matcher.any
Tff7b72import T7ee787dev.mokkery.mock
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableStateFlow
Tff7b72import T7ee787kotlinx.coroutines.test.runTest
Tff7b72import T7ee787org.meshtastic.core.model.ConnectionState
Tff7b72import T7ee787org.meshtastic.core.model.Node
Tff7b72import T7ee787org.meshtastic.core.model.NodeSortOption
Tff7b72import T7ee787org.meshtastic.core.repository.ConnectionStateProvider
Tff7b72import T7ee787org.meshtastic.core.repository.RadioConfigRepository
Tff7b72import T7ee787org.meshtastic.core.testing.FakeDeviceHardwareRepository
Tff7b72import T7ee787org.meshtastic.core.testing.FakeNodeRepository
Tff7b72import T7ee787org.meshtastic.core.testing.FakeRadioController
Tff7b72import T7ee787org.meshtastic.core.testing.FakeRadioInterfaceService
Tff7b72import T7ee787org.meshtastic.core.testing.TestDataFactory
Tff7b72import T7ee787org.meshtastic.feature.node.detail.NodeManagementActions
Tff7b72import T7ee787org.meshtastic.feature.node.detail.NodeRequestActions
Tff7b72import T7ee787org.meshtastic.feature.node.domain.usecase.GetFilteredNodesUseCase
Tff7b72import T7ee787kotlin.test.BeforeTest
Tff7b72import T7ee787kotlin.test.Test
Tff7b72import T7ee787kotlin.test.assertEquals
Tff7b72import T7ee787kotlin.test.assertNotNull
Tff7b72class T56d364NodeListViewModelTest Tb4b4b4{
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3viewModelTb4b4b4: Te6edf3NodeListViewModel
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3nodeRepositoryTb4b4b4: Te6edf3FakeNodeRepository
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3radioControllerTb4b4b4: Te6edf3FakeRadioController
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3radioInterfaceServiceTb4b4b4: Te6edf3FakeRadioInterfaceService
Tff7b72private Tff7b72val Te6edf3radioConfigRepositoryTb4b4b4: Te6edf3RadioConfigRepository Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3connectionStateProviderTb4b4b4: Te6edf3ConnectionStateProvider Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3nodeFilterPreferencesTb4b4b4: Te6edf3NodeFilterPreferences Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3nodeManagementActionsTb4b4b4: Te6edf3NodeManagementActions Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3nodeRequestActionsTb4b4b4: Te6edf3NodeRequestActions Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3getFilteredNodesUseCaseTb4b4b4: Te6edf3GetFilteredNodesUseCase Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tf0883e@BeforeTest
Tff7b72fun Td2a8ffsetUpTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3nodeRepository Tff7b72= Te6edf3FakeNodeRepositoryTb4b4b4(Tb4b4b4)
Te6edf3radioController Tff7b72= Te6edf3FakeRadioControllerTb4b4b4(Tb4b4b4)
Te6edf3radioInterfaceService Tff7b72= Te6edf3FakeRadioInterfaceServiceTb4b4b4(Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3localConfigFlow Tb4b4b4} Te6edf3returns Te6edf3MutableStateFlowTb4b4b4(Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3LocalConfigTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3radioConfigRepositoryTb4b4b4.Te6edf3deviceProfileFlow Tb4b4b4} Te6edf3returns Te6edf3MutableStateFlowTb4b4b4(Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3DeviceProfileTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3connectionStateProviderTb4b4b4.Te6edf3connectionState Tb4b4b4} Te6edf3returns Te6edf3MutableStateFlowTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3nodeSortOption Tb4b4b4} Te6edf3returns Te6edf3MutableStateFlowTb4b4b4(Te6edf3NodeSortOptionTb4b4b4.Te6edf3LAST_HEARDTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3includeUnknown Tb4b4b4} Te6edf3returns Te6edf3MutableStateFlowTb4b4b4(Tff7b72trueTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3excludeInfrastructure Tb4b4b4} Te6edf3returns Te6edf3MutableStateFlowTb4b4b4(Tff7b72falseTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3onlyOnline Tb4b4b4} Te6edf3returns Te6edf3MutableStateFlowTb4b4b4(Tff7b72falseTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3onlyDirect Tb4b4b4} Te6edf3returns Te6edf3MutableStateFlowTb4b4b4(Tff7b72falseTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3showIgnored Tb4b4b4} Te6edf3returns Te6edf3MutableStateFlowTb4b4b4(Tff7b72falseTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3nodeFilterPreferencesTb4b4b4.Te6edf3excludeMqtt Tb4b4b4} Te6edf3returns Te6edf3MutableStateFlowTb4b4b4(Tff7b72falseTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3getFilteredNodesUseCaseTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3MutableStateFlowTb4b4b4(Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3viewModel Tff7b72= Te6edf3createViewModelTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffcreateViewModelTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3NodeListViewModelTb4b4b4(
Te6edf3savedStateHandle Tff7b72= Te6edf3SavedStateHandleTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3nodeRepository Tff7b72= Te6edf3nodeRepositoryTb4b4b4,
Te6edf3radioConfigRepository Tff7b72= Te6edf3radioConfigRepositoryTb4b4b4,
Te6edf3connectionStateProvider Tff7b72= Te6edf3connectionStateProviderTb4b4b4,
Te6edf3adminController Tff7b72= Te6edf3radioControllerTb4b4b4,
Te6edf3radioInterfaceService Tff7b72= Te6edf3radioInterfaceServiceTb4b4b4,
Te6edf3deviceHardwareRepository Tff7b72= Te6edf3FakeDeviceHardwareRepositoryTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3nodeManagementActions Tff7b72= Te6edf3nodeManagementActionsTb4b4b4,
Te6edf3nodeRequestActions Tff7b72= Te6edf3nodeRequestActionsTb4b4b4,
Te6edf3getFilteredNodesUseCase Tff7b72= Te6edf3getFilteredNodesUseCaseTb4b4b4,
Te6edf3nodeFilterPreferences Tff7b72= Te6edf3nodeFilterPreferencesTb4b4b4,
Tb4b4b4)
Tf0883e@Test
Tff7b72fun Td2a8fftestInitializationTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3assertNotNullTb4b4b4(Te6edf3viewModelTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`nodeList emits updates when repository changes`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3nodesFlow Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3NodeTff7b72>Tff7b72>Tb4b4b4(Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3getFilteredNodesUseCaseTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3nodesFlow
Tff7b72val Te6edf3vm Tff7b72= Te6edf3createViewModelTb4b4b4(Tb4b4b4)
Te6edf3vmTb4b4b4.Te6edf3nodeListTb4b4b4.Te6edf3test Tb4b4b4{
T8b949e// Initial value from stateIn
Te6edf3assertEqualsTb4b4b4(Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3awaitItemTb4b4b4(Tb4b4b4)Tb4b4b4)
T8b949e// Trigger update
Tff7b72val Te6edf3testNodes Tff7b72= Te6edf3TestDataFactoryTb4b4b4.Te6edf3createTestNodesTb4b4b4(T79c0ff3Tb4b4b4)
Te6edf3nodesFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3testNodes
Te6edf3assertEqualsTb4b4b4(T79c0ff3Tb4b4b4, Te6edf3awaitItemTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3sizeTb4b4b4)
Te6edf3cancelAndIgnoreRemainingEventsTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`isActive is false for the default filter`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3assertEqualsTb4b4b4(Tff7b72falseTb4b4b4, Te6edf3NodeFilterStateTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3isActiveTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`isActive is true when unknown nodes are opted out`Tb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// includeUnknown defaults to true, so a persisted false is a user-applied narrowing filter.
Te6edf3assertEqualsTb4b4b4(Tff7b72trueTb4b4b4, Te6edf3NodeFilterStateTb4b4b4(Te6edf3includeUnknown Tff7b72= Tff7b72falseTb4b4b4)Tb4b4b4.Te6edf3isActiveTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`connectionState reflects serviceRepository state`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3stateFlow Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3ConnectionStateTff7b72>Tb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3connectionStateProviderTb4b4b4.Te6edf3connectionState Tb4b4b4} Te6edf3returns Te6edf3stateFlow
Tff7b72val Te6edf3vm Tff7b72= Te6edf3createViewModelTb4b4b4(Tb4b4b4)
Te6edf3vmTb4b4b4.Te6edf3connectionStateTb4b4b4.Te6edf3test Tb4b4b4{
Te6edf3assertEqualsTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4, Te6edf3awaitItemTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3stateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Te6edf3assertEqualsTb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4, Te6edf3awaitItemTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3cancelAndIgnoreRemainingEventsTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.06s